package com.fruit.dao;

import java.io.Serializable;
import java.util.List;

import com.fruit.system.model.Pager;

public interface BaseDao<T>
{

	/**
	 * 保存一条记录
	 * @param t
	 * @return Serializable 增加的记录的id
	 */
	Serializable saveEntity(T t);

	/**
	 * 增加或者更新 1:数据库没有该记录增加 ; 2:数据库已有该记录则更新
	 * @param t
	 */
	void saveOrUpdateEntity(T t);

	/**
	 * 更新记录
	 * @param t 要更新的记录对象
	 */
	void updateEntity(T t);

	/**
	 * 删除操作
	 * @param t 要删除的记录,包含id
	 */
	void deleteEntity(T t);

	/**
	 * 懒加载查询
	 * @param id
	 * @return 
	 */
	T loadEntity(Serializable id);

	
	T getEntity(Serializable id);

	/**
	 * 查询所有记录
	 * @return List<T> 
	 */
	List<T> findAllEntity();

	/**
	 * 查询带有条件的所有记录
	 * @param hql hql语句
	 * @param values 参数列表
	 * @return List<Object> 返回结果集合,
	 * 	类型为泛型Object是因为如果是类似<br>
	 * 	select id,name from tablename返回的List集合的每一个元素是Object[]类型
	 */
	List<T> findEntityByHql(String hql, Object... values);

	/**
	 * 查询单一记录
	 * @param hql hql语句
	 * @param values 参数列表
	 * @return 单一结果对象
	 */
	Object findUniqueResultByHql(String hql, Object... values);
	/**
	 * 分页查询所有记录
	 * @param hql hql语句
	 * @param values 参数列表
	 * @return 分页模型
	 */
	Pager<T> findAllEntityByPager();
	/**
	 * 分页查询带有条件的所有记录
	 * @param hql hql语句
	 * @param values 参数列表
	 * @return 分页模型
	 */
	Pager<Object> findEntityByPager(String hql,Object...values);

	/**
	 * 执行批量更新
	 * @param hql hql语句
	 * @param values 参数列表
	 */
	 void batchEntityByHql(String hql, Object... values);

	/**
	 * 原生sql查询
	 * @param sql 原始sql语句
	 * @param values  参数列表
	 * @return List<T> 集合类型
	 */
	List<T> executeFindSql(String sql, Object... values);

	/**
	 * 原生sql查询
	 * @param clz 若果当前查询的不是映射到数据库中的实体，此查询的查询结果将会将其封装成指定的clz
	 * @param sql 原生sql语句
	 * @param values 参数列表
	 * @return List<T> 集合类型
	 */
	<E> List<E> executeFindSql(Class<E> clz, String sql,
			Object... values);

	/**
	 * 查询单一记录
	 * @param sql sql语句
	 * @param values 参数列表
	 * @return 单一结果对象
	 */
	Object findUniqueResultBySql(String sql, Object... values);
	/**
	 * 原生sql更新
	 * @param sql 原生sql语句
	 * @param values 参数列表
	 */
	void executeUpdateSql(String sql, Object... values);
	
	/**
	 * 原生sql分页查询
	 * @param sql 原始sql语句
	 * @param values  参数列表
	 * @return Pager<T> 分页模型
	 */
	Pager<T> executeFindSqlByPager(String sql, Object...values);
	
	 <E> Pager<E> executeFindSqlByPager(Class<E> clz, String sql, Object...values);
	/**
	 * 查询满足条件的总记录数
	 * @param hql
	 * @param values
	 * @return
	 */
	 long getCountByHql(String hql, Object...values);
	
	/**
	 * 查询满足条件的总记录数
	 * @param hql
	 * @param values
	 * @return
	 */
	 long getCountBySql(String sql, Object...values);

}